package com.zwq.zwqjavanotes.utils;

import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.zwq.zwqjavanotes.entity.json.Users;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @ClassName JSONUtil
 * @Description JSON操作工具类
 * @Author @gnplum O_o
 * @Date 2025/5/14 17:46
 * @Version 1.0
 */
public class JSONUtil {
    /**
     * @ClassName FastJSONDemo
     * @Description FastJSON2（阿里开源，高性能）的使用示例
     * @Author @gnplum O_o
     * @Date 2025/5/14 16:54
     * @Version 1.0
     */
    public static void operateByFastJson2(){
        Users user = new Users("Leo", 25);

        // 对象转 JSON 字符串
        String json = JSON.toJSONString(user);
        System.out.println(">> FastJSON--对象转JSON: " + json); // 输出: {"age":25,"name":"Leo"}

        // JSON 字符串转对象
        Users parsedUser = JSON.parseObject(json, Users.class);
        System.out.println(">> FastJSON--JSON转对象: " + parsedUser.getName()); // 输出: Leo

        // 处理 List 转 JSON 数组
        //List<User2> users = List.of(new User2("A", 20), new User2("B", 21));//Java 9中可以使用List.of()
        List<Users> users =new ArrayList<Users>();
        Users u21=new Users("A",20);
        Users u22=new Users("B",21);
        users.add(u21);
        users.add(u22);
        String jsonArray = JSON.toJSONString(users);
        System.out.println(">> FastJSON--List转JSON数组: " + jsonArray); // 输出: [{"age":20,"name":"A"},{"age":21,"name":"B"}]

        // Java 8 兼容写法 1：使用 Arrays.asList（注意：返回的是固定大小列表）
        List<Users> users1 = Arrays.asList(new Users("A", 20), new Users("B", 21));
        // 若需要可变列表，可包装为 ArrayList
        List<Users> users2 = new ArrayList<>(Arrays.asList(new Users("A", 20), new Users("B", 21)));

        // 序列化示例
        String jsonArray2 = JSON.toJSONString(users2);
        System.out.println(">> FastJSON--可变List转JSON数组: " + jsonArray2);
    }
    /**
     * @ClassName JacksonDemo
     * @Description Jackson（最流行的高性能库）的使用示例
     * @Author @gnplum O_o
     * @Date 2025/5/14 15:19
     * @Version 1.0
     */
    public static void operateByJackson(){
        ObjectMapper mapper = new ObjectMapper();
        Users user = new Users("Lily", 22);

        try {
            // 对象转 JSON 字符串
            String json = mapper.writeValueAsString(user);
            System.out.println(">> Jackson--对象转JSON: " + json); // 输出: {"name":"Lily","age":22}

            // JSON 字符串转对象
            Users parsedUser = mapper.readValue(json, Users.class);
            System.out.println(">> Jackson--JSON转对象: " + parsedUser.getName()); // 输出: Lily
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * @ClassName GsonDemo
     * @Description Gson（Google 出品，简单易用）的使用示例
     * @Author @gnplum O_o
     * @Date 2025/5/14 16:41
     * @Version 1.0
     */
    public static void operateByGson(){
        Gson gson = new Gson();
        Users user = new Users("Lucas", 28);

        // 对象转 JSON 字符串
        String json = gson.toJson(user);
        System.out.println(">> Gson--对象转JSON: " + json); // 输出: {"name":"Lucas","age":28}

        // JSON 字符串转对象
        Users parsedUser = gson.fromJson(json, Users.class);
        System.out.println(">> Gson--JSON转对象: " + parsedUser.getAge()); // 输出: 28
    }
    /**
     * @ClassName JsonOrgDemo
     * @Description JSON.org（轻量级基础库）的使用示例
     * @Author @gnplum O_o
     * @Date 2025/5/14 16:48
     * @Version 1.0
     */
    public static void operateByJsonOrg(){
        // 手动构造 JSON 对象
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("name", "Mia");
        jsonObj.put("age", 30);
        System.out.println(">> JSON.org--构造的JSON: " + jsonObj.toString()); // 输出: {"name":"Mia","age":30}

        // 解析 JSON 字符串
        String jsonStr = "{\"name\":\"Mia\",\"age\":30}";
        JSONObject parsedObj = new JSONObject(jsonStr);
        System.out.println(">> JSON.org--解析的name: " + parsedObj.getString("name")); // 输出: Mia
    }
}
